Реализация gRPC-метода LogoutUser в auth-service
Разработка обработчика LogoutUser, инвалидация Access-токена в Redis и отзыв сессии в PostgreSQL.
- Репозиторий / Компонент:
auth-service(Внутренний контур авторизации). - Контракт методов: gRPC
rpc LogoutUser(LogoutRequest) returns (LogoutResponse); - Спецификация контракта: См. Раздел: Protobuf Контракт
- Статус: Готово к реализации
В открытом доступе представлена демонстрационная версия задачи. В настоящей публичной документации отображены не все шаги, технические сценарии и приватные эндпоинты для системы цифровых симуляторов бизнес-процессов.
- Полная спецификация метода: Доступна только во внутреннем контуре разработки (Confluence / Swagger Enterprise).
- Для получения доступа: Обратитесь к системному аналитику или Product Owner вашей команды.
Предварительные условия (Prerequisites):
- Перед началом разработки убедиться, что структура Protobuf-сообщения перенесена в репозиторий контрактов строго в соответствии со Спецификацией Protobuf.
- Сгенерировать серверные стабы (gRPC stubs) для целевого языка компонента
auth-service.
Инструкция по шагам:
На Шаге 3 (Прием запроса и валидация): Реализовать gRPC-обработчик для метода
LogoutUser. Обеспечить строгое чтение параметровrefresh_tokenиuser_idиз входящего Protobuf-сообщенияLogoutRequest. Если хотя бы одно из полей отсутствует или передано в невалидном формате, прерывать выполнение и возвращать статус-кодgRPC Status: INVALID_ARGUMENT.На Шаге 4 (Инвалидация через Блэклист): Внутри обработчика разобрать метаданные сессии и вычислить оставшееся время жизни (
Remaining TTL) для соответствующего Access-токена. Выполнить команду внесения токена в распределенный кэш блокировок Redis:SET "blacklist:access:<access_token_hash>" "revoked" EX <Remaining_TTL>.Перехват исключений (Fail-Close): Завернуть операцию записи в Redis в блок обработки исключений. При падении кэша или сетевом таймауте (
Redis.ConnectionError,Redis.TimeoutError), задействовать стратегию Fail-Close: принудительно прерывать транзакцию, логировать критический сбой системы и возвращать вызывающей стороне ошибку, которая на шлюзе трансформируется в логический бизнес-статусHTTP 503 Service Unavailable.На Шаге 6 (Деактивация в СУБД): При успешной фиксации токена в Redis, инициировать транзакцию в PostgreSQL (
DB_AUTH).Выполнить SQL-запрос на закрытие сессии:
UPDATE user_sessions SET is_revoked = true WHERE refresh_token_hash = :refresh_token_hash AND user_id = :user_id;Если СУБД возвращает статус
UPDATE 0(запись не найдена), генерировать внутренний логический ответ “Сессия не найдена”. При успешном обновлении строки сформировать и вернуть gRPC-ответLogoutResponseс флагомsuccess: true.